﻿using DataLayer;
using SupportLayer.Constantes.Outros;
using SupportLayer.Enums;
using SupportLayer.Objetos.Elementos;
using SupportLayer.Objetos.Espacamento;
using SupportLayer.Objetos.Outros;
using SupportLayer.Objetos.Placa;
using SupportLayer.Util.ExtensionMethods;
using System;
using System.Collections.Generic;
using System.Data;
using System.Web.UI.WebControls;

namespace TranSys_Web.UCs
{
  public partial class ucPlaca : System.Web.UI.UserControl
  {
    public PlacaClass Placa { get; set; }
    public string Separador { get; set; }

    public int GapHeight
    {
      get
      {
        int i = Placa.GapHeightRound;
        i = i / (Placa.Linhas.Count * 2);
        return i;
      }
    }

    private double Divideby
    {
      get
      {
        int divisao = 0, sobra = 0;
        divisao = Placa.Width / 1000;
        sobra = Placa.Width % 1000;

        if (divisao >= 1)
        {
          if (sobra < 10)
            return Convert.ToDouble((divisao.ToString() + Separador + "00" + sobra.ToString()));
          else if (sobra < 100)
            return Convert.ToDouble((divisao.ToString() + Separador + "0" + sobra.ToString()));
          else
            return Convert.ToDouble((divisao.ToString() + Separador + sobra.ToString()));
        }
        else
          return 1;
      }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
      sectionPlaca.ClientIDMode = System.Web.UI.ClientIDMode.Static;
      sectionEspacamento.ClientIDMode = System.Web.UI.ClientIDMode.Static;
      CarregaPlaca();
      CarregaEspacamento();
    }

    private void CarregaPlaca()
    {
      // Setando a altura e a largura da placa inteira

      sectionPlaca.Style.Add("height", (Placa.RoundedHeight / Divideby).toStringNumber() + "px");
      sectionPlaca.Style.Add("width", (Placa.RoundedWidth / Divideby).toStringNumber() + "px");

      List<Panel> lstLinhas = new List<Panel>();
      int numLinhas = Placa.Linhas.Count;

      for (int iLinha = 0; iLinha < numLinhas; iLinha++)
      {
        Panel pnlLinha = new Panel();
        Panel pnlBorda = new Panel();
        Panel pnlMensagem = new Panel();
        Panel pnlSeta = new Panel();
        Panel pnlPictograma = new Panel();
        LinhaClass Linha = Placa.Linhas[iLinha];
        bool hasGrouping = false;
        TipoSeta tipoSeta = TipoSeta.S2N;

        if (Placa.Linhas[iLinha].AgruparSeta)
        {
          if (iLinha > 0)
            if (Placa.Linhas[iLinha - 1].AgruparSeta)
              continue;
          hasGrouping = true;
        }

        pnlLinha = CarregaLinha(Placa.Linhas[iLinha]);

        if (hasGrouping)
        {
          int quantidadeAgrupamentos = 1;
          if (iLinha < numLinhas - 1)
            if (Placa.Linhas[iLinha + 1].AgruparSeta)
              quantidadeAgrupamentos = 2;

          pnlBorda = CarregaBordaAgrupada(Linha, iLinha, numLinhas, quantidadeAgrupamentos);

          // Verifica se tem seta. Se não houver, o texto deve ser centralizado
          int posicaoSeta = -1;
          bool isOnlyText = false;
          for (int iElementos = 0; iElementos < Linha.Elements.Count; iElementos++)
            if (Linha.Elements[iElementos].Element is SetaClass)
              posicaoSeta = iElementos;

          if (posicaoSeta >= 0)
            tipoSeta = ((SetaClass)Linha.Elements[posicaoSeta].Element).GetTipoSeta();
          else if (Linha.hasPictograma() < 0)
            isOnlyText = true;

          List<Panel> lstPictogramas = new List<Panel>();
          // For para gerar todos os elementos da linha. Confere se há seta e pictograma
          for (int y = 0; y < Linha.Elements.Count; y++)
          {
            if (Linha.Elements[y].Element is SetaClass)
              pnlSeta = new UCs.LoadSeta(GapHeight, Placa, Divideby).SetaDupla(iLinha, y, tipoSeta, SetaAnteriorEsquerda(iLinha));
            else if (Linha.Elements[y].Element is PictogramaClass)
            {
              int qtdAgrupamentosPictogramas = 0;
              if (qtdAgrupamentosPictogramas == 0)
                lstPictogramas.Add(new UCs.LoadPictograma(GapHeight, Placa, Divideby)
                      .PictogramaSimples(Linha, y, tipoSeta, SetaAnteriorEsquerda(y)));
              else
                lstPictogramas.Add(new UCs.LoadPictograma(GapHeight, Placa, Divideby)
                      .PictogramaDuplo(iLinha, y, tipoSeta, SetaAnteriorEsquerda(y), qtdAgrupamentosPictogramas));
            }
            else if (Linha.Elements[y].Element is MensagemClass)
              pnlMensagem = new UCs.LoadMensagem(GapHeight, Placa, Divideby)
                      .MensagemDupla(iLinha, y, tipoSeta, SetaAnteriorEsquerda(iLinha), quantidadeAgrupamentos, isOnlyText);
          }

          // Coloca os painéis na painel borda
          pnlBorda.Controls.Add(pnlSeta);
          lstPictogramas.ForEach(a => pnlBorda.Controls.Add(a));
          //pnlBorda.Controls.Add(pnlPictograma);
          pnlBorda.Controls.Add(pnlMensagem);

          pnlLinha.Controls.Add(pnlBorda);
          lstLinhas.Add(pnlLinha);
        }
        else
        {
          if (iLinha > 0 && Placa.Linhas[iLinha - 1].AgruparSeta)
            continue;

          #region Carrega a borda da linha simples

          pnlBorda = CarregaBordaSimples(Placa.Linhas[iLinha], iLinha, numLinhas);

          // For para gerar todos os elementos da linha. Confere se há seta e pictograma
          for (int y = 0; y < Linha.Elements.Count; y++)
          {
            if (Linha.Elements[y].Element is SetaClass)
              pnlSeta = new UCs.LoadSeta(GapHeight, Placa, Divideby).SetaSimples(Linha, y, Linha.hasSeta(), SetaAnteriorEsquerda(iLinha));
            else if (Linha.Elements[y].Element is PictogramaClass)
              pnlPictograma = new UCs.LoadPictograma(GapHeight, Placa, Divideby).PictogramaSimples(Linha, y, Linha.hasSeta(), SetaAnteriorEsquerda(iLinha));
            else if (Linha.Elements[y].Element is MensagemClass)
              pnlMensagem = new UCs.LoadMensagem(GapHeight, Placa, Divideby).MensagemSimples(Linha, y, Linha.hasSeta(), Linha.isOnlyText(), SetaAnteriorEsquerda(iLinha));
          }

          pnlBorda.Controls.Add(pnlSeta);
          pnlBorda.Controls.Add(pnlPictograma);
          pnlBorda.Controls.Add(pnlMensagem);
          pnlLinha.Controls.Add(pnlBorda);
          lstLinhas.Add(pnlLinha);

          #endregion Carrega a borda da linha simples
        }
      }

      lstLinhas.ForEach(a => sectionPlaca.Controls.Add(a));
    }

    private Panel CarregaLinha(LinhaClass linhaClass)
    {
      // Adiciona os elementos de estilo na linha
      Panel pnlLinha = new Panel();
      pnlLinha.Style.Add("float", "left");
      pnlLinha.Style.Add("min-width", (((Placa.RoundedWidth) - Placa.Margin * 2) / Divideby).toStringNumber() + "px");
      pnlLinha.Style.Add("background", linhaClass.Cor);
      pnlLinha.Style.Add("padding", (Placa.Margin / Divideby).toStringNumber() + "px");
      pnlLinha.Style.Add("padding-bottom", "0");
      return pnlLinha;
    }

    private Panel CarregaBordaSimples(LinhaClass linhaClass, int iLinha, int numLinhas)
    {
      Panel pnlBorda = new Panel();
      pnlBorda.Style.Add("float", "left");

      // Colocando o número de linhas na base zero, para as comparações com iLinha
      numLinhas--;
      double height = 0,
              width = 0,
              margintop = 0,
              marginbottom = 0,
              topleftradius = 0,
              toprightradius = 0,
              bottomleftradius = 0,
              bottomrightradius = 0,
              topborder = 0,
              rightborder = 0,
              leftborder = 0,
              bottomborder = 0;

      height = linhaClass.Height / Divideby;
      width = (Placa.RoundedWidth - (Placa.Border * 2 + Placa.Margin * 2)) / Divideby;
      topleftradius = toprightradius = bottomleftradius = bottomrightradius = Placa.Radius / Divideby;
      topborder = rightborder = leftborder = bottomborder = Placa.Border / Divideby;

      // Verifica se há mais de uma linha na placa e, se houver, retira o radius
      if (iLinha < numLinhas)
        bottomleftradius = bottomrightradius = 0;

      // Se não for a última linha e se houver mais linhas, tirar metade da borda de baixo.
      if ((iLinha < numLinhas) && (numLinhas > 0))
        bottomborder = (Placa.Border / 2) / Divideby;

      // Se não for a primeira linha, posiciona a linha mais acima para evitar espaçamento a mais.
      if (iLinha > 0)
      {
        topborder = (Placa.Border / 2) / Divideby;
        topleftradius = toprightradius = 0;
        margintop = -(Placa.Margin / Divideby);
      }

      if (iLinha == numLinhas)
        marginbottom = Placa.Margin / Divideby;

      pnlBorda.Style.Add("height", height.toStringNumber() + "px");
      pnlBorda.Style.Add("width", width.toStringNumber() + "px");

      pnlBorda.Style.Add("border-top-left-radius", topleftradius.toStringNumber() + "px");
      pnlBorda.Style.Add("border-top-right-radius", toprightradius.toStringNumber() + "px");
      pnlBorda.Style.Add("border-bottom-left-radius", bottomleftradius.toStringNumber() + "px");
      pnlBorda.Style.Add("border-bottom-right-radius", bottomrightradius.toStringNumber() + "px");

      pnlBorda.Style.Add("border-top", topborder.toStringNumber() + "px solid " + linhaClass.CorTexto);
      pnlBorda.Style.Add("border-right", rightborder.toStringNumber() + "px solid " + linhaClass.CorTexto);
      pnlBorda.Style.Add("border-left", leftborder.toStringNumber() + "px solid " + linhaClass.CorTexto);
      pnlBorda.Style.Add("border-bottom", bottomborder.toStringNumber() + "px solid " + linhaClass.CorTexto);

      pnlBorda.Style.Add("margin-top", margintop.toStringNumber() + "px");
      //pnlBorda.Style.Add("margin-right", marginright.toStringNumber() + "px");
      //pnlBorda.Style.Add("margin-left", marginleft.toStringNumber() + "px");
      pnlBorda.Style.Add("margin-bottom", marginbottom.toStringNumber() + "px");

      return pnlBorda;
    }

    private Panel CarregaBordaAgrupada(LinhaClass linhaClass, int iLinha, int numLinhas, int quantidadeAgrupamentos)
    {
      Panel pnlBorda = new Panel();
      pnlBorda.Style.Add("float", "left");

      // Colocando o número de linhas na base 0, para as comparações com iLinha
      numLinhas--;
      double height = 0,
              width = 0,
              margintop = 0,
              marginbottom = 0,
              topleftradius = 0,
              toprightradius = 0,
              bottomleftradius = 0,
              bottomrightradius = 0,
              topborder = 0,
              rightborder = 0,
              leftborder = 0,
              bottomborder = 0;

      height = linhaClass.Height / Divideby;
      width = (Placa.RoundedWidth - (Placa.Border * 2 + Placa.Margin * 2)) / Divideby;
      topleftradius = toprightradius = bottomleftradius = bottomrightradius = Placa.Radius / Divideby;
      topborder = rightborder = leftborder = bottomborder = Placa.Border / Divideby;

      if (quantidadeAgrupamentos == 2)
        height = ((linhaClass.Height +
                    Placa.Linhas[iLinha + 1].Height +
                    Placa.Linhas[iLinha + 2].Height -
                    (linhaClass.Gap * 2)) / Divideby);
      else if (quantidadeAgrupamentos == 1)
        height = ((linhaClass.Height +
                    Placa.Linhas[iLinha + 1].Height -
                    linhaClass.Gap) / Divideby);

      width = ((Placa.RoundedWidth - (Placa.Border * 2 + Placa.Margin * 2)) / Divideby);

      // Verifica se há mais de uma linha na placa e, se houver retira o radius.
      if (iLinha + quantidadeAgrupamentos < Placa.Linhas.Count - 1)
        bottomleftradius = bottomrightradius = 0;

      // Se não for a última linha e se houver mais linhas, tirar metade da borda de baixo.
      if ((iLinha + quantidadeAgrupamentos < numLinhas) && (numLinhas > 0))
        bottomborder = (Placa.Border / 2) / Divideby;

      // Se não for a primeira linha, posiciona a linha mais acima para evitar espaçamento a mais.
      if (iLinha > 0)
      {
        topborder = (Placa.Border / 2) / Divideby;
        topleftradius = toprightradius = 0;
        margintop = -(Placa.Margin / Divideby);
      }

      // Lembrando que o numLinhas está na base 0, portanto quando é 0 tem 1 entrada.
      bool condicao1 = ((numLinhas == 1) && (Placa.Linhas[0].AgruparSeta));
      bool condicao2 = ((numLinhas == 2) && (Placa.Linhas[1].AgruparSeta));
      bool condicao3 = ((numLinhas == 3) && (Placa.Linhas[2].AgruparSeta) &&
        (Placa.Linhas[0].AgruparSeta) && (iLinha == 2));
      bool condicao4 = ((Placa.Linhas.Count == 4) && (Placa.Linhas[2].AgruparSeta) &&
        (Placa.Linhas[1].AgruparSeta) && (iLinha > 0));
      bool condicao5 = ((Placa.Linhas.Count == 4) && (!Placa.Linhas[0].AgruparSeta) &&
        (!Placa.Linhas[1].AgruparSeta) && (Placa.Linhas[2].AgruparSeta));

      if (condicao1 || condicao2 || condicao3 || condicao4 || condicao5)
        marginbottom = Placa.Margin / Divideby;

      pnlBorda.Style.Add("height", height.toStringNumber() + "px");
      pnlBorda.Style.Add("width", width.toStringNumber() + "px");

      pnlBorda.Style.Add("border-top-left-radius", topleftradius.toStringNumber() + "px");
      pnlBorda.Style.Add("border-top-right-radius", toprightradius.toStringNumber() + "px");
      pnlBorda.Style.Add("border-bottom-left-radius", bottomleftradius.toStringNumber() + "px");
      pnlBorda.Style.Add("border-bottom-right-radius", bottomrightradius.toStringNumber() + "px");

      pnlBorda.Style.Add("border-top", topborder.toStringNumber() + "px solid " + linhaClass.CorTexto);
      pnlBorda.Style.Add("border-right", rightborder.toStringNumber() + "px solid " + linhaClass.CorTexto);
      pnlBorda.Style.Add("border-left", leftborder.toStringNumber() + "px solid " + linhaClass.CorTexto);
      pnlBorda.Style.Add("border-bottom", bottomborder.toStringNumber() + "px solid " + linhaClass.CorTexto);

      pnlBorda.Style.Add("margin-top", margintop.toStringNumber() + "px");
      //pnlBorda.Style.Add("margin-right", marginright.toStringNumber() + "px");
      //pnlBorda.Style.Add("margin-left", marginleft.toStringNumber() + "px");
      pnlBorda.Style.Add("margin-bottom", marginbottom.toStringNumber() + "px");

      return pnlBorda;
    }

    private bool SetaAnteriorEsquerda(int y)
    {
      if (y <= 0)
        return false;

      switch (Placa.Linhas[y - 1].hasSeta())
      {
        case TipoSeta.S1O:
        case TipoSeta.S1NO:
        case TipoSeta.S1SO:
        case TipoSeta.S2NO:
        case TipoSeta.S2SO:
        case TipoSeta.S3O:
          return true;
        case TipoSeta.S1N:
        case TipoSeta.S2N:
          if (Placa.Linhas[y - 2] == null)
            return false;

          switch (Placa.Linhas[y - 2].hasSeta())
          {
            case TipoSeta.S1O:
            case TipoSeta.S1NO:
            case TipoSeta.S1SO:
            case TipoSeta.S2NO:
            case TipoSeta.S2SO:
            case TipoSeta.S3O:
              return true;
            default:
              return false;
          }

        default:
          return false;
      }
    }

    private void CarregaEspacamento()
    {
      lblFundo1.Text = lblFundo2.Text = lblFundo3.Text = lblFundo4.Text = "";
      lblH1.Text = lblH2.Text = lblH3.Text = lblH4.Text = "";
      lblSeta1.Text = lblSeta2.Text = lblSeta3.Text = lblSeta4.Text = "";
      lblTarja1.Text = lblTarja2.Text = lblTarja3.Text = lblTarja4.Text = "";
      rptEspaco1.DataSource = null;
      rptEspaco1.DataBind();


      for (int x = 0; x < Placa.Linhas.Count; x++)
      {
        DataTable dt = new DataTable();
        dt.Columns.Add("Letra");
        dt.Columns.Add("Espacamento");

        int total = 0;

        LinhaClass Linha = Placa.Linhas[x];
        List<EspacamentoClass> lstEspacamento = new List<EspacamentoClass>();

        foreach (ElementoClass elemento in Linha.Elements)
          if (elemento.Element is MensagemClass)
            lstEspacamento = ((MensagemClass)elemento.Element).GetEspacamento();

        if (lstEspacamento.Count <= 0)
          continue;

        int soma = 0;

        for (int iEspacamento = 0; iEspacamento < lstEspacamento.Count; iEspacamento++)
        {
          EspacamentoClass esp = lstEspacamento[iEspacamento];

          soma = 0;

          if (esp.Direita > 0)
          {
            soma = esp.Direita;
            total += esp.Direita;
          }
          if (iEspacamento < lstEspacamento.Count - 1)
          {
            soma += lstEspacamento[iEspacamento + 1].Esquerda;
            total += esp.Esquerda;
          }

          dt.Rows.Add(esp.Caractere, esp.Largura);
          total += esp.Largura;

          if (!(iEspacamento == lstEspacamento.Count - 1))
            if (!((esp.Caractere == ' ') || (lstEspacamento[iEspacamento + 1].Caractere == ' ')))
              dt.Rows.Add("", soma);

          //  if (!((iEspacamento > 0) && (lstEspacamento[iEspacamento - 1].Caractere == ' ')))
          //  {

          //  }

          //  dt.Rows.Add(esp.Caractere, esp.Largura.ToString(), no_soma);

          //  if (esp.Direita > 0)
          //    if (!((iEspacamento < lstEspacamento.Count + 1) && (lstEspacamento[iEspacamento + 1].Caractere == ' ')))
          //      if (lstEspacamento[iEspacamento + 1].Esquerda > 0)
          //        dt.Rows.Add("", esp.Direita,
          //          string.Format("{0}{1}</td>", Soma, esp.Direita + lstEspacamento[iEspacamento + 1].Esquerda));
          //      else
          //        dt.Rows.Add("", esp.Direita, no_soma);
        }


        if (x == 0)
        {
          rptLetra1.DataSource = rptEspaco1.DataSource = dt;
          rptLetra1.DataBind();
          rptEspaco1.DataBind();

          CorClass Cor = new CorClass().FindByCorFundo(Linha.Cor);

          lblFundo1.Text = "Fundo: " + Cor.Descricao.Substring(0, Cor.Descricao.IndexOf("/"));
          lblTexto1.Text = "Texto: " + Cor.Descricao.Substring(Cor.Descricao.IndexOf("/") + 1);
          lblTarja1.Text = "Tarja: " + Cor.Descricao.Substring(Cor.Descricao.IndexOf("/") + 1);

          if (Linha.AgruparSeta)
            lblSeta1.Text = "Seta Tipo S2";
          else
            if ((x > 0) && (Placa.Linhas[x - 1].AgruparSeta))
              lblSeta1.Text = "Seta Tipo S2";
            else if ((x > 1) && (Placa.Linhas[x - 2].AgruparSeta))
              lblSeta1.Text = "Seta Tipo S2";
            else
              foreach (ElementoClass elemento in Linha.Elements)
                if (elemento.Element is SetaClass)
                  lblSeta1.Text = "Seta Tipo S1";

          lblTipoLetra1.Text = "Série " + (Linha.Fonte.Contains("EM") ? "E(M)" : "D");
          lblH1.Text = "H = " + (int)Linha.AlturaLetra;
          lblTotal1.Text = total.ToString();
        }
        else if (x == 1)
        {
          rptLetra2.DataSource = rptEspaco2.DataSource = dt;
          rptLetra2.DataBind();
          rptEspaco2.DataBind();

          CorClass Cor = new CorClass().FindByCorFundo(Linha.Cor);

          lblFundo2.Text = "Fundo: " + Cor.Descricao.Substring(0, Cor.Descricao.IndexOf("/"));
          lblTexto2.Text = "Texto: " + Cor.Descricao.Substring(Cor.Descricao.IndexOf("/") + 1);
          lblTarja2.Text = "Tarja: " + Cor.Descricao.Substring(Cor.Descricao.IndexOf("/") + 1);

          if (Linha.AgruparSeta)
            lblSeta2.Text = "Seta Tipo S2";
          else
            if ((x > 0) && (Placa.Linhas[x - 1].AgruparSeta))
              lblSeta2.Text = "Seta Tipo S2";
            else if ((x > 1) && (Placa.Linhas[x - 2].AgruparSeta))
              lblSeta2.Text = "Seta Tipo S2";
            else
              foreach (ElementoClass elemento in Linha.Elements)
                if (elemento.Element is SetaClass)
                  lblSeta2.Text = "Seta Tipo S1";

          lblTipoLetra2.Text = "Série " + (Linha.Fonte.Contains("EM") ? "E(M)" : "D");
          lblH2.Text = "H = " + (int)Linha.AlturaLetra;
          lblTotal2.Text = total.ToString();
        }
        else if (x == 2)
        {
          rptLetra3.DataSource = rptEspaco3.DataSource = dt;
          rptLetra3.DataBind();
          rptEspaco3.DataBind();

          CorClass Cor = new CorClass().FindByCorFundo(Linha.Cor);

          lblFundo3.Text = "Fundo: " + Cor.Descricao.Substring(0, Cor.Descricao.IndexOf("/"));
          lblTexto3.Text = "Texto: " + Cor.Descricao.Substring(Cor.Descricao.IndexOf("/") + 1);
          lblTarja3.Text = "Tarja: " + Cor.Descricao.Substring(Cor.Descricao.IndexOf("/") + 1);

          if (Linha.AgruparSeta)
            lblSeta3.Text = "Seta Tipo S2";
          else
            if ((x > 0) && (Placa.Linhas[x - 1].AgruparSeta))
              lblSeta3.Text = "Seta Tipo S2";
            else if ((x > 1) && (Placa.Linhas[x - 2].AgruparSeta))
              lblSeta3.Text = "Seta Tipo S2";
            else
              foreach (ElementoClass elemento in Linha.Elements)
                if (elemento.Element is SetaClass)
                  lblSeta3.Text = "Seta Tipo S1";

          lblTipoLetra3.Text = "Série " + (Linha.Fonte.Contains("EM") ? "E(M)" : "D");
          lblH3.Text = "H = " + (int)Linha.AlturaLetra;
          lblTotal3.Text = total.ToString();
        }
        else if (x == 3)
        {
          rptLetra4.DataSource = rptEspaco4.DataSource = dt;
          rptLetra4.DataBind();
          rptEspaco4.DataBind();

          CorClass Cor = new CorClass().FindByCorFundo(Linha.Cor);

          lblFundo4.Text = "Fundo: " + Cor.Descricao.Substring(0, Cor.Descricao.IndexOf("/"));
          lblTexto4.Text = "Texto: " + Cor.Descricao.Substring(Cor.Descricao.IndexOf("/") + 1);
          lblTarja4.Text = "Tarja: " + Cor.Descricao.Substring(Cor.Descricao.IndexOf("/") + 1);

          if (Linha.AgruparSeta)
            lblSeta4.Text = "Seta Tipo S2";
          else
            if ((x > 0) && (Placa.Linhas[x - 1].AgruparSeta))
              lblSeta4.Text = "Seta Tipo S2";
            else if ((x > 1) && (Placa.Linhas[x - 2].AgruparSeta))
              lblSeta4.Text = "Seta Tipo S2";
            else
              foreach (ElementoClass elemento in Linha.Elements)
                if (elemento.Element is SetaClass)
                  lblSeta4.Text = "Seta Tipo S1";

          lblTipoLetra4.Text = "Série " + (Linha.Fonte.Contains("EM") ? "E(M)" : "D");
          lblH4.Text = "H = " + (int)Linha.AlturaLetra;
          lblTotal4.Text = total.ToString();
        }
      }
    }
  }
}